﻿/**
  KCAKCAK   CAKCAKC   AK      CA
 AK        KC     CA  AK    AK
CA         KC     CA  AK  KC
CA         KCAKCAKCA  AKCA
CA         KC     CA  AK  KC
 AK        KC     CA  AK    AK
  KCAKCAK  KC     CA  AK      CA

_________________________________________________________________
 China ataca Kamchatka - copyright 2007(c)Ruben Sainz de la Maza
 
	@class: 	App
	@vertion: 	0.1
	@date:		25/02/08
				
	@language: 	ActionScript 3.0
	@author:	Ruben Sainz de la Maza
			
**/

//carga de clases
load("classes/Cliente.asc");
load("classes/Rooms.asc");
load("classes/Chat.asc");


	/**
	 * inicializar la aplicacion
	 */
	application.onAppStart = function()
	{
	//	trace("#application# onAppStart " + application.name);

		this.intID 						= 0;				//contador ID de usuarios
		this.objUsers					= new Object();		//contenedor de usuarios
		this.objRooms					= new Object();		//contenedor de salas
		this.objRooms["lobby"] 			= new Object();		//crear la sala lobby por default
		this.objRooms["lobby"].users 	= 0;				//cantidad de usuarios en el lobby
		this.rooms 						= new Rooms();		//ref a la clase Rooms
		this.chat 						= new Chat();		//ref a la clase Chat

	//	this.keepAlive 	= setInterval(verifyConnectedClient, 60000);  // verificar cada 60segs si el usuario sigue conectado
	}


	/**
	 * evento al ingresar un usuario
	 * @param   pClient :referencia al cliente
	 * @param   pUser   :nick
	 * @return  true/false dependiendo si se acepta al cliente
	 */
	application.onConnect = function(pClient, pUser)//:Boolean
	{
	//	trace("#application# onConnect " + pClient.ip + " / " + pUser.strNick);

	//	for(var i in pUser) trace("#attributes# " + i + ": " + pUser[i])

		var _objClient  = pClient;
		var _objUser	= pUser;
		var _strNick  	= _objUser.strNick;

	/**
	*  Rechazar usuario si...
	*/

		// mas de x usuarios conectados
		if(this.clients.length >= 2){
		//	trace("#application# reject usuarios > x");
			this.rejectConnection(_objClient, { msg:"No hay más lugar en el servidor!  Intentá conectarte mas tarde!", error:"servidorFull" });
			return false;
		}

		// nick repetido
		if(this.objUsers[_strNick] != null){
		//	trace("#application# reject usuario repetido: " + _strNick);
			this.rejectConnection(_objClient, { msg:"Ya existe un usuario con el nick " + _strNick, error:"usuarioRepetido" });
			return false;
		}


	/**
	* Aceptar usuario
	*/
		_objClient.intID		= this.intID++;	//generar nuevo ID
		_objClient.room			= "lobby";		//al lobby
		_objClient.attributes	= _objUser;		//guardar los atributos del usuario
		_objClient.strNick		= _strNick;		//guardar nombre
		_objClient.readAccess 	= "public";		//acceso de lectura publico
		_objClient.writeAccess 	= "public";		//acceso de escritura publico
	//	_objClient.bwIntervalID	= setInterval(_objClient, "checkBandwidth", 10000);

		this.acceptConnection(_objClient);		//aceptar al cliente
		this.objUsers[_strNick] = _objClient;	//guardar una referencia del cliente

	//	trace("#application# accept " + this.objUsers[_strNick].intID + ": " + this.objUsers[_strNick].strNick);
		
		this.rooms.pushUser(null, _strNick, _objClient.room);	//enviar el nuevo usuario al lobby		
		return true;
	}


	/**
	 * evento cuando un usuario se desconecta, borrar su registro
	 * @param   pClient :referencia al cliente
	 */
	application.onDisconnect = function(pClient)//:void
	{
		var _objClient	= pClient;				//ref
		var _strNick	= _objClient.strNick;		//obtener el nick del cliente

		this.rooms.popUser(null, _strNick);			//eliminar el usuario de las salas
		clearInterval(_objClient.bwIntervalID);	
		this.objUsers[_strNick] = null;				//borrar el cliente de la lista de usuarios
		delete this.objUsers[_strNick];				//eliminar el objeto que lo contiene

	//	trace("#application# onDisconnect " + _objClient.intID + ": " + _strNick);
	}


	/**
	 * evento al detener la aplicación
	 */
	application.onAppStop = function()
	{
	//	trace("#application# onAppStop");
	}
